30. 使用NoSQL技术

Spring Data提供其他项目,用来帮你使用各种各样的NoSQL技术,包括MongoDB, Neo4J, Elasticsearch, Solr, Redis, Gemfire, CouchbaseCassandra。Spring Boot为Redis, MongoDB, Elasticsearch, Solr和Cassandra提供自动配置。你也可以充分利用其他项目,但需要自己配置它们,具体查看projects.spring.io/spring-data中相应的参考文档。

30.1. Redis

Redis是一个缓存,消息中间件及具有丰富特性的键值存储系统。Spring Boot为Jedis客户端library提供基本的自动配置,Spring Data Redis提供了在它之上的抽象,spring-boot-starter-redis'Starter'收集了需要的依赖。

30.1.1. 连接Redis

你可以注入一个自动配置的RedisConnectionFactoryStringRedisTemplate或普通的RedisTemplate实例,或任何其他Spring Bean只要你愿意。默认情况下,这个实例将尝试使用localhost:6379连接Redis服务器:

@Component
public class MyBean {

    private StringRedisTemplate template;

    @Autowired
    public MyBean(StringRedisTemplate template) {
        this.template = template;
    }
    // ...
}

如果你添加一个自己的,或任何自动配置类型的@Bean,它将替换默认实例(除了RedisTemplate的情况,它是根据bean的name 'redisTemplate'而不是类型进行排除的)。如果在classpath路径下存在commons-pool2,默认你会获得一个连接池工厂。

30.2. MongoDB

MongoDB是一个开源的NoSQL文档数据库,它使用类JSON格式的模式(schema)替换了传统的基于表的关系数据。Spring Boot为使用MongoDB提供了很多便利,包括spring-boot-starter-data-mongodb'Starter'。

30.2.1. 连接MongoDB数据库

你可以注入一个自动配置的org.springframework.data.mongodb.MongoDbFactory来访问Mongo数据库。默认情况下,该实例将尝试使用URL mongodb://localhost/test连接到MongoDB服务器:

import org.springframework.data.mongodb.MongoDbFactory;
import com.mongodb.DB;

@Component
public class MyBean {

    private final MongoDbFactory mongo;

    @Autowired
    public MyBean(MongoDbFactory mongo) {
        this.mongo = mongo;
    }

    // ...
    public void example() {
        DB db = mongo.getDb();
        // ...
    }
}

你可以设置spring.data.mongodb.uri来改变该url,并配置其他的设置,比如副本集:

spring.data.mongodb.uri=mongodb://user:[email protected]:12345,mongo2.example.com:23456/test

另外,跟正在使用的Mongo 2.x一样,你可以指定host/port,比如,在application.properties中添加以下配置:

spring.data.mongodb.host=mongoserver
spring.data.mongodb.port=27017

Mongo 3.0 Java驱动不支持spring.data.mongodb.hostspring.data.mongodb.port,对于这种情况,spring.data.mongodb.uri需要提供全部的配置信息。

如果没有指定spring.data.mongodb.port,默认使用27017,上述示例中可以删除这行配置。

如果不使用Spring Data Mongo,你可以注入com.mongodb.Mongo beans以代替MongoDbFactory

如果想完全控制MongoDB连接的建立过程,你可以声明自己的MongoDbFactoryMongo bean。 如果想全面控制MongoDB连接的建立,你也可以声明自己的MongoDbFactory或Mongo,@Beans。

30.2.2. MongoDBTemplate

Spring Data Mongo提供了一个MongoTemplate类,它的设计和Spring的JdbcTemplate很相似。跟JdbcTemplate一样,Spring Boot会为你自动配置一个bean,你只需简单的注入即可:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

    private final MongoTemplate mongoTemplate;

    @Autowired
    public MyBean(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }
    // ...
}

具体参考MongoOperations Javadoc。

30.2.3. Spring Data MongoDB仓库

Spring Data包含的仓库也支持MongoDB,正如上面讨论的JPA仓库,基于方法名自动创建查询是基本的原则。

实际上,不管是Spring Data JPA还是Spring Data MongoDB都共享相同的基础设施。所以你可以使用上面的JPA示例,并假设那个City现在是一个Mongo数据类而不是JPA @Entity,它将以同样的方式工作:

package com.example.myapp.domain;

import org.springframework.data.domain.*;
import org.springframework.data.repository.*;

public interface CityRepository extends Repository<City, Long> {

    Page<City> findAll(Pageable pageable);

    City findByNameAndCountryAllIgnoringCase(String name, String country);

}

想详细了解Spring Data MongoDB,包括它丰富的对象映射技术,可以查看它的参考文档

30.2.4 内嵌的Mongo

Spring Boot为内嵌Mongo提供自动配置,你需要添加de.flapdoodle.embed:de.flapdoodle.embed.mongo依赖才能使用它。

spring.data.mongodb.port属性可用来配置Mongo监听的端口,将该属性值设为0,表示使用一个随机分配的可用端口。通过MongoAutoConfiguration创建的MongoClient将自动配置为使用随机分配的端口。

如果classpath下存在SLF4J依赖,Mongo产生的输出将自动路由到一个名为org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongo的logger。

想要完全控制Mongo实例的配置和日志路由,你可以声明自己的IMongodConfigIRuntimeConfig beans。

30.3 Neo4j

Neo4j是一个开源的NoSQL图数据库,它使用图(graph)相关的概念来描述数据模型,把数据保存为图中的节点以及节点之间的关系。相比传统rdbms(关系管理系统)的方式,Neo4j更适合大数据关系分析。Spring Boot为使用Neo4j提供很多便利,包括spring-boot-starter-data-neo4j‘Starter’。

30.1. Redis

Redis是一个缓存,消息中间件及具有丰富特性的键值存储系统。Spring Boot为Jedis客户端library提供基本的自动配置,Spring Data Redis提供了在它之上的抽象,spring-boot-starter-redis'Starter'收集了需要的依赖。

30.1.1. 连接Redis

你可以注入一个自动配置的RedisConnectionFactoryStringRedisTemplate或普通的RedisTemplate实例,或任何其他Spring Bean只要你愿意。默认情况下,这个实例将尝试使用localhost:6379连接Redis服务器:

@Component
public class MyBean {

    private StringRedisTemplate template;

    @Autowired
    public MyBean(StringRedisTemplate template) {
        this.template = template;
    }
    // ...
}

如果你添加一个自己的,或任何自动配置类型的@Bean,它将替换默认实例(除了RedisTemplate的情况,它是根据bean的name 'redisTemplate'而不是类型进行排除的)。如果在classpath路径下存在commons-pool2,默认你会获得一个连接池工厂。

30.2. MongoDB

MongoDB是一个开源的NoSQL文档数据库,它使用类JSON格式的模式(schema)替换了传统的基于表的关系数据。Spring Boot为使用MongoDB提供了很多便利,包括spring-boot-starter-data-mongodb'Starter'。

30.2.1. 连接MongoDB数据库

你可以注入一个自动配置的org.springframework.data.mongodb.MongoDbFactory来访问Mongo数据库。默认情况下,该实例将尝试使用URL mongodb://localhost/test连接到MongoDB服务器:

import org.springframework.data.mongodb.MongoDbFactory;
import com.mongodb.DB;

@Component
public class MyBean {

    private final MongoDbFactory mongo;

    @Autowired
    public MyBean(MongoDbFactory mongo) {
        this.mongo = mongo;
    }

    // ...
    public void example() {
        DB db = mongo.getDb();
        // ...
    }
}

你可以设置spring.data.mongodb.uri来改变该url,并配置其他的设置,比如副本集:

spring.data.mongodb.uri=mongodb://user:[email protected]:12345,mongo2.example.com:23456/test

另外,跟正在使用的Mongo 2.x一样,你可以指定host/port,比如,在application.properties中添加以下配置:

spring.data.mongodb.host=mongoserver
spring.data.mongodb.port=27017

Mongo 3.0 Java驱动不支持spring.data.mongodb.hostspring.data.mongodb.port,对于这种情况,spring.data.mongodb.uri需要提供全部的配置信息。

如果没有指定spring.data.mongodb.port,默认使用27017,上述示例中可以删除这行配置。

如果不使用Spring Data Mongo,你可以注入com.mongodb.Mongo beans以代替MongoDbFactory

如果想完全控制MongoDB连接的建立过程,你可以声明自己的MongoDbFactoryMongo bean。 如果想全面控制MongoDB连接的建立,你也可以声明自己的MongoDbFactory或Mongo,@Beans。

30.2.2. MongoDBTemplate

Spring Data Mongo提供了一个MongoTemplate类,它的设计和Spring的JdbcTemplate很相似。跟JdbcTemplate一样,Spring Boot会为你自动配置一个bean,你只需简单的注入即可:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

    private final MongoTemplate mongoTemplate;

    @Autowired
    public MyBean(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }
    // ...
}

具体参考MongoOperations Javadoc。

30.2.3. Spring Data MongoDB仓库

Spring Data包含的仓库也支持MongoDB,正如上面讨论的JPA仓库,基于方法名自动创建查询是基本的原则。

实际上,不管是Spring Data JPA还是Spring Data MongoDB都共享相同的基础设施。所以你可以使用上面的JPA示例,并假设那个City现在是一个Mongo数据类而不是JPA @Entity,它将以同样的方式工作:

package com.example.myapp.domain;

import org.springframework.data.domain.*;
import org.springframework.data.repository.*;

public interface CityRepository extends Repository<City, Long> {

    Page<City> findAll(Pageable pageable);

    City findByNameAndCountryAllIgnoringCase(String name, String country);

}

想详细了解Spring Data MongoDB,包括它丰富的对象映射技术,可以查看它的参考文档

30.2.4 内嵌的Mongo

Spring Boot为内嵌Mongo提供自动配置,你需要添加de.flapdoodle.embed:de.flapdoodle.embed.mongo依赖才能使用它。

spring.data.mongodb.port属性可用来配置Mongo监听的端口,将该属性值设为0,表示使用一个随机分配的可用端口。通过MongoAutoConfiguration创建的MongoClient将自动配置为使用随机分配的端口。

如果classpath下存在SLF4J依赖,Mongo产生的输出将自动路由到一个名为org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongo的logger。

想要完全控制Mongo实例的配置和日志路由,你可以声明自己的IMongodConfigIRuntimeConfig beans。

30.3 Neo4j

Neo4j是一个开源的NoSQL图数据库,它使用图(graph)相关的概念来描述数据模型,把数据保存为图中的节点以及节点之间的关系。相比传统rdbms(关系管理系统)的方式,Neo4j更适合大数据关系分析。Spring Boot为使用Neo4j提供很多便利,包括spring-boot-starter-data-neo4j‘Starter’。

30.3.1 连接Neo4j数据库

你可以注入一个自动配置的Neo4jSessionSession,或Neo4jOperations实例,就像使用其他Spring Bean那样。该实例默认使用localhost:7474连接Neo4j服务器:

@Component
public class MyBean {

    private final Neo4jTemplate neo4jTemplate;

    @Autowired
    public MyBean(Neo4jTemplate neo4jTemplate) {
        this.neo4jTemplate = neo4jTemplate;
    }

    // ...

}

添加自己的org.neo4j.ogm.config.Configuration @Bean,你就能完全控制该配置了。同时,添加一个Neo4jOperations类型的@Bean可以禁用自动配置。

通过spring.data.neo4j.*属性可以配置使用的用户和凭证:

spring.data.neo4j.uri=http://my-server:7474
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=secret

30.3.2 使用内嵌模式

Neo4j的内嵌模式从属于不同的许可,在将它集成到应用之前确保复查下。

如果将org.neo4j:neo4j-ogm-embedded-driver依赖添加到应用中,Spring Boot会自动配置一个进程内(in-process)的内嵌Neo4j实例,当应用关闭时,该实例不会持久化任何数据。设置spring.data.neo4j.embedded.enabled=false可显式关闭该模式,你也可以启用内嵌模式的持久化特性:

spring.data.neo4j.uri=file://var/tmp/graph.db

30.3.3 Neo4jSession

Neo4jSession默认的生命周期是应用程序范围,如果运行的是web应用,你可以很轻松的改变它的scope:

spring.data.neo4j.session.scope=session

30.3.4 Spring Data Neo4j仓库

Spring Data包含的仓库也支持Neo4j,实际上,Spring Data JPA和Spring Data Neo4j使用相同的常用设施,所以你可以采用先前JPA的示例,假设City现在是一个Neo4j OGM @NodeEntity而不是JPA @Entity,它将以同样的方式工作。

你可以使用@EntityScan注解定义实体扫描路径。

将以下两个注解添加到你的Spring configuration,可以启用repository支持(还有可选的对@Transactional的支持):

@EnableNeo4jRepositories(basePackages = "com.example.myapp.repository")
@EnableTransactionManagement

30.3.5 仓库示例

package com.example.myapp.domain;

import org.springframework.data.domain.*;
import org.springframework.data.repository.*;

public interface CityRepository extends GraphRepository<City> {

    Page<City> findAll(Pageable pageable);

    City findByNameAndCountry(String name, String country);

}

想详细了解Spring Data Neo4j,包括它丰富的对象映射技术,可查看它的参考文档

30.4 Gemfire

Spring Data Gemfire为使用Pivotal Gemfire数据管理平台提供了方便的,Spring友好的工具。Spring Boot提供了一个用于聚集依赖的spring-boot-starter-data-gemfire'Starter',目前不支持Gemfire的自动配置,但你只需使用一个注解就能使Spring Data仓库支持它。

30.5 Solr

Apache Solr是一个搜索引擎。Spring Boot为Solr 5客户端library提供基本的自动配置,Spring Data Solr提供了在它之上的抽象,还有用于收集依赖的spring-boot-starter-data-solr'Starter'。

30.5.1 连接Solr

你可以注入一个自动配置的SolrClient实例,就像其他Spring beans那样,该实例默认使用localhost:8983/solr连接Solr服务器:

@Component
public class MyBean {

    private SolrClient solr;

    @Autowired
    public MyBean(SolrClient solr) {
        this.solr = solr;
    }

    // ...

}

如果你添加自己的SolrClient类型的@Bean,它将会替换默认实例。

30.5.2 Spring Data Solr仓库

Spring Data包含的仓库也支持Apache Solr,正如先前讨论的JPA仓库,基于方法名自动创建查询是基本的原则。

实际上,不管是Spring Data JPA还是Spring Data Solr都共享相同的基础设施。所以你可以使用先前的JPA示例,并假设那个City现在是一个@SolrDocument类而不是JPA @Entity,它将以同样的方式工作。

具体参考Spring Data Solr文档

30.6 Elasticsearch

Elastic Search是一个开源的,分布式,实时搜索和分析引擎。Spring Boot为Elasticsearch提供基本的自动配置,Spring Data Elasticsearch提供在它之上的抽象,还有用于收集依赖的spring-boot-starter-data-elasticsearch'Starter'。

30.6.1 使用Jest连接Elasticsearch

如果添加Jest依赖,你可以注入一个自动配置的JestClient,默认目标为http://localhost:9200/,也可以进一步配置该客户端:

spring.elasticsearch.jest.uris=http://search.example.com:9200
spring.elasticsearch.jest.read-timeout=10000
spring.elasticsearch.jest.username=user
spring.elasticsearch.jest.password=secret

定义一个JestClient bean以完全控制注册过程。

30.6.2 使用Spring Data连接Elasticsearch

你可以注入一个自动配置的ElasticsearchTemplate或Elasticsearch Client实例,就想其他Spring Bean那样。该实例默认内嵌一个本地,内存型服务器(在Elasticsearch中被称为Node),并使用当前工作目录作为服务器的home目录。在这个步骤中,首先要做的是告诉Elasticsearch将文件存放到什么地方:

spring.data.elasticsearch.properties.path.home=/foo/bar

另外,你可以通过设置spring.data.elasticsearch.cluster-nodes(逗号分隔的‘host:port’列表)来切换为远程服务器:

spring.data.elasticsearch.cluster-nodes=localhost:9300
@Component
public class MyBean {

    private ElasticsearchTemplate template;

    @Autowired
    public MyBean(ElasticsearchTemplate template) {
        this.template = template;
    }

    // ...

}

如果添加自己的ElasticsearchTemplate类型的@Bean,它将覆盖默认实例。

30.6.3 Spring Data Elasticseach仓库

Spring Data包含的仓库也支持Elasticsearch,正如前面讨论的JPA仓库,基于方法名自动创建查询是基本的原则。

实际上,不管是Spring Data JPA还是Spring Data Elasticsearch都共享相同的基础设施。所以你可以使用前面的JPA示例,并假设那个City现在是一个Elasticsearch @Document类而不是JPA @Entity,它将以同样的方式工作。

具体参考Spring Data Elasticsearch文档

30.7 Cassandra

Cassandra是一个开源,分布式数据库管理系统,设计用于处理跨很多商品服务器的大数据。Spring Boot为Cassandra提供自动配置,Spring Data Cassandra提供在它之上的抽象,还有收集依赖的spring-boot-starter-data-cassandra‘Starter’。

30.7.1 连接Cassandra

你可以注入一个自动配置的CassandraTemplate或Cassandra Session实例,就像注入其他Spring Bean那样。spring.data.cassandra.*属性可用来自定义该连接,通常你需要提供keyspace-namecontact-points属性:

spring.data.cassandra.keyspace-name=mykeyspace
spring.data.cassandra.contact-points=cassandrahost1,cassandrahost2
@Component
public class MyBean {

    private CassandraTemplate template;

    @Autowired
    public MyBean(CassandraTemplate template) {
        this.template = template;
    }

    // ...

}

如果添加自己的CassandraTemplate类型的@Bean,它将替换默认实例。

30.7.2 Spring Data Cassandra仓库

Spring Data包含的仓库对Cassandra提供基本支持,目前受到的限制比先前讨论的JPA仓库要多,并且需要使用@Query注解相应的查找方法。

想全面了解Spring Data Cassandra,可查看它的参考指南

30.8 Couchbase

Couchbase是一个基于文档,分布式多模型的开源数据库,设计用于交互式应用程序。Spring Boot为Couchbase提供自动配置,Spring Data Couchbase提供在它之上的抽象,还有收集依赖的spring-boot-starter-data-couchbase‘Starter’。

30.8.1 连接Couchbase

通过添加Couchbase SDK和一些配置,你可以很容易获取一个BucketClusterspring.couchbase.*属性可用于自定义该连接。通常,你需要提供启动hosts,bucket name和password:

spring.couchbase.bootstrap-hosts=my-host-1,192.168.1.123
spring.couchbase.bucket.name=my-bucket
spring.couchbase.bucket.password=secret

你至少需要提供启动host(s),在这种情况下,bucket name默认为default,password默认为空字符串。另外,你可以定义自己的org.springframework.data.couchbase.config.CouchbaseConfigurer @Bean来把控所有配置。

你也可以自定义一些CouchbaseEnvironment设置,例如,以下配置改变打开新Bucket的超时时间(timeout),还启用了SSL支持:

spring.couchbase.env.timeouts.connect=3000
spring.couchbase.env.ssl.key-store=/location/of/keystore.jks
spring.couchbase.env.ssl.key-store-password=secret

具体查看spring.couchbase.env.*属性。

30.8.2 Spring Data Couchbase仓库

Spring Data包含的仓库也支持Couchbase,具体可查看Spring Data Couchbase的参考文档

你可以注入一个自动配置的CouchbaseTemplate实例,就像注入其他Spring Bean那样,只要默认的CouchbaseConfigurer可以使用。如果想关闭Spring Data Couchbase的自动配置,你可以提供自己的org.springframework.data.couchbase.config.AbstractCouchbaseDataConfiguration实现。

@Component
public class MyBean {

    private final CouchbaseTemplate template;

    @Autowired
    public MyBean(CouchbaseTemplate template) {
        this.template = template;
    }

    // ...

}

如果添加你自己的CouchbaseTemplate类型的@Bean,且名称为couchbaseTemplate,那它将替换默认实例。

31.1 支持的缓存提供商

缓存抽象不提供实际的存储,而是依赖于org.springframework.cache.Cacheorg.springframework.cache.CacheManager接口的实现。只要通过@EnableCaching注解开启缓存支持,Spring Boot就会根据实现自动配置一个合适的CacheManager

如果你使用的缓存设施beans不是基于接口的,确保启用proxyTargetClass,并设置其属性为@EnableCaching

使用spring-boot-starter-cache‘Starter’可以快速添加所需缓存依赖,如果你是手动添加依赖,需要注意一些实现只有spring-context-support jar才提供。

如果你还没有定义一个CacheManager类型的bean,或一个名为cacheResolverCacheResolver(查看CachingConfigurer),Spring Boot将尝试以下提供商(按这个顺序):

spring.cache.type属性可强制指定使用的缓存提供商,如果需要在一些环境(比如,测试)中禁用全部缓存也可以使用该属性。

如果CacheManager是Spring Boot自动配置的,你可以在它完全初始化前,通过实现CacheManagerCustomizer接口进一步配置,以下设置使用的缓存name: java @Bean public CacheManagerCustomizer<ConcurrentMapCacheManager> cacheManagerCustomizer() { return new CacheManagerCustomizer<ConcurrentMapCacheManager>() { @Override public void customize(ConcurrentMapCacheManager cacheManager) { cacheManager.setCacheNames(Arrays.asList("one", "two")); } }; } 在以上示例中,需要配置一个ConcurrentMapCacheManager,如果没有配置,则自定义器(customizer)将不会被调用。自定义器你添加多少都可以,并可以使用@OrderOrdered对它们进行排序。

31.1.1 Generic

如果上下文定义至少一个org.springframework.cache.Cache bean,一个配置好的CacheManager包装着它们,那么将使用通用(Generic)缓存。

31.1.2 JCache (JSR-107)

classpath下存在javax.cache.spi.CachingProvider(比如,一个遵循JSR-107的缓存library),则JCache将启动。这里有很多遵循JSR-107的libraries,Spring Boot为Ehcache 3, Hazelcast和Infinispan提供依赖管理,其他library也可以像这样添加。

如果出现多个提供商,你需要明确指定使用哪个(提供商)。尽管JSR-107标准没有强制定义配置文件的位置,Spring Boot会尽量配合各实现情况:

# Only necessary if more than one provider is present
spring.cache.jcache.provider=com.acme.MyCachingProvider
spring.cache.jcache.config=classpath:acme.xml

由于一个缓存library可能提供的既有native实现,也有JSR-107支持,Spring Boot将优先使用JSR-107支持,这样如果你切换到不同的JSR-107实现,相同特性依旧可以使用。

以下方式可以自定义底层的javax.cache.cacheManager

  • 通过设置spring.cache.cache-names属性,缓存可以在启动时就被创建。如果定义一个javax.cache.configuration.Configuration bean,它将用于自定义缓存。

  • 使用CacheManager的引用调用org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer beans可完成全部配置。

如果定义标准的javax.cache.CacheManager,它将自动包装进org.springframework.cache.CacheManager以实现预期的抽象,也不能对它进一步配置了。

31.1.3 EhCache 2.x

如果在classpath下的根目录可以找到一个名为ehcache.xml的文件,则缓存将使用EhCache 2.x。如果EhCache 2.x和这样的文件出现,那它们将用于启动缓存管理器,使用以下配置可提供替换的配置文件:

spring.cache.ehcache.config=classpath:config/another-config.xml

31.1.4 Hazelcast

Spring Boot为Hazelcast提供通常的支持,如果HazelcastInstance被自动配置,那它将自动包装进一个CacheManager

如果出于某些原因,需要使用另一个不同的HazelcastInstance,你可以请求Spring Boot创建一个单独的实例,并只用于该CacheManager

spring.cache.hazelcast.config=classpath:config/my-cache-hazelcast.xml

如果以这种方式创建一个单独的HazelcastInstance,它将不会注册到应用上下文中。

31.1.5 Infinispan

Infinispan没有默认的配置文件位置,所以需要显式指定:

spring.cache.infinispan.config=infinispan.xml

通过设置spring.cache.cache-names属性可以让缓存在启动时就被创建,如果定义了ConfigurationBuilder bean,它将用来定义该实例。

31.1.6 Couchbase

如果Couchbase可用,并配置好了,CouchbaseCacheManager将会自动配置,使用spring.cache.cache-names属性可以在启动时创建其他缓存。对Bucket的操作也是自动配置的,你可以使用customizer在另一个Bucket上创建其他缓存:假设你需要在“main” Bucket上存放两个缓存(foobar),在另一个Bucket上存放一个存活时间为2秒的biz缓存。首先,你通过配置创建两个缓存:

spring.cache.cache-names=foo,bar

然后定义其他@Configuration来配置另一个Bucketbiz缓存:

@Configuration
public class CouchbaseCacheConfiguration {

    private final Cluster cluster;

    public CouchbaseCacheConfiguration(Cluster cluster) {
        this.cluster = cluster;
    }

    @Bean
    public Bucket anotherBucket() {
        return this.cluster.openBucket("another", "secret");
    }

    @Bean
    public CacheManagerCustomizer<CouchbaseCacheManager> cacheManagerCustomizer() {
        return c -> {
            c.prepareCache("biz", CacheBuilder.newInstance(anotherBucket())
                    .withExpirationInMillis(2000));
        };
    }

}

这个示例配置重用了通过自动配置的Cluster

31.1.7 Redis

如果Redis可用,并配置好了,RedisCacheManager将被自动配置,使用spring.cache.cache-names可以在启动时创建其他缓存。

默认会添加key前缀以防止两个单独的缓存使用相同的key,否则Redis将存在重复的key,有可能返回不可用的值。如果创建自己的RedisCacheManager,强烈建议你保留该配置处于启用状态。

31.1.8 Caffeine

Caffeine是Java8对Guava缓存的重写版本,在Spring Boot 2.0中将取代Guava。如果出现Caffeine,CaffeineCacheManager将会自动配置。使用spring.cache.cache-names属性可以在启动时创建缓存,并可以通过以下配置进行自定义(按顺序):

  1. spring.cache.caffeine.spec定义的特殊缓存
  2. com.github.benmanes.caffeine.cache.CaffeineSpec bean定义
  3. com.github.benmanes.caffeine.cache.Caffeine bean定义

例如,以下配置创建一个foobar缓存,最大数量为500,存活时间为10分钟:

spring.cache.cache-names=foo,bar
spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s

除此之外,如果定义了com.github.benmanes.caffeine.cache.CacheLoader,它会自动关联到CaffeineCacheManager。由于该CacheLoader将关联被该缓存管理器管理的所有缓存,所以它必须定义为CacheLoader<Object, Object>,自动配置将忽略所有泛型类型。

31.1.9 Guava

如果存在Guava,GuavaCacheManager会自动配置。使用spring.cache.cache-names属性可以在启动时创建缓存,并通过以下方式之一自定义(按此顺序):

  1. spring.cache.guava.spec定义的特殊缓存
  2. com.google.common.cache.CacheBuilderSpec bean定义的
  3. com.google.common.cache.CacheBuilder bean定义的

例如,以下配置创建了一个foobar缓存,该缓存最大数量为500,存活时间为10分钟:

spring.cache.cache-names=foo,bar
spring.cache.guava.spec=maximumSize=500,expireAfterAccess=600s

此外,如果定义com.google.common.cache.CacheLoader bean,它会自动关联到GuavaCacheManager。由于该CacheLoader将关联该缓存管理器管理的所有缓存,它必须定义为CacheLoader<Object, Object>,自动配置会忽略所有泛型类型。

31.1.10 Simple

如果以上选项都没有采用,一个使用ConcurrentHashMap作为缓存存储的简单实现将被配置,这是应用没有添加缓存library的默认设置。

31.1.11 None

如果配置类中出现@EnableCaching,一个合适的缓存配置也同样被期待。如果在某些环境需要禁用全部缓存,强制将缓存类型设为none将会使用一个no-op实现(没有任何实现的实现):

spring.cache.type=none